Pad Delphi pri definici vicerozmeroveho konstantniho pole

Otázka od: Ing. Jiri SOKOL

27. 11. 2002 12:06

Ahoj,

zkousel jsem toto:

type
 pole=array[1..2,1..5]of variant;
const
 status:pole=
 (1,true,'Ahoj','Uvitani',''),
 (2,false,'Hezky den','Rozlouceni','');

Pak mi spadnou cely Delphi. Nevite nekdo, kde delam chybu?
P.S.:Obsah konstatniho pole berte s rezervou ... hodnoty pouzivam jine, ale
nejsou stejneho typu a
proto bych potreboval udrzet typ variant

Ing. Jiri Sokol, js-delphi@seznam.cz, +420251431187
D6ProfSP2,WinNT
amatersky programator

______________________________________________________________________
Reklama:
Mapy Prahy, Brna a Cech najdete na http://www.mapy.cz

Odpovedá: Lebeda David

27. 11. 2002 12:30

> zkousel jsem toto:
>
> type
> pole=array[1..2,1..5]of variant;
> const
> status:pole=
> (1,true,'Ahoj','Uvitani',''),
> (2,false,'Hezky den','Rozlouceni','');
>
> Pak mi spadnou cely Delphi. Nevite nekdo, kde delam chybu?
> P.S.:Obsah konstatniho pole berte s rezervou ... hodnoty pouzivam
> jine, ale nejsou stejneho typu a proto bych potreboval udrzet typ
> variant

Ahoj,

a nebylo by lepsi mit jednorozmerne pole recordu? Record je
vhodnejsi k uchovavani dat ruznych typu.

David Lebeda

Odpovedá: Robert Vršecký

27. 11. 2002 16:05

Proč padájí delphi je jasné. Pokud se napíše
array[1..2,1..5]of variant, tak pole může být pouze jednoho typu. (např
integer). Není možné mít jednu hodnotu číselnou a druhou hodnotu textovou,
protože tomu delphi nemůžou rozumět... Rešení je opravdu přes record viz
předchozií příspěvek a nebo přes dynamické pole...teda pokud chceš udržet
proměnnou typu varriant a mít více rozměrné pole....
Robert

----- Original Message -----
From: "Ing. Jiri SOKOL" <JS-delphi@seznam.cz>
To: "dotaz-delp" <delphi-l@clexpert.cz>
Sent: Wednesday, November 27, 2002 10:07 AM
Subject: Pad Delphi pri definici vicerozmeroveho konstantniho pole


Ahoj,

zkousel jsem toto:

type
 pole=array[1..2,1..5]of variant;
const
 status:pole=
 (1,true,'Ahoj','Uvitani',''),
 (2,false,'Hezky den','Rozlouceni','');

Pak mi spadnou cely Delphi. Nevite nekdo, kde delam chybu?
P.S.:Obsah konstatniho pole berte s rezervou ... hodnoty pouzivam jine, ale
nejsou stejneho typu a
proto bych potreboval udrzet typ variant

Ing. Jiri Sokol, js-delphi@seznam.cz, +420251431187
D6ProfSP2,WinNT
amatersky programator

______________________________________________________________________
Reklama:
Mapy Prahy, Brna a Cech najdete na http://www.mapy.cz

Odpovedá: Petr Vones

27. 11. 2002 22:59

From: "Ing. Jiri SOKOL" <JS-delphi@seznam.cz>
> To uz me taky napadlo, ale zajimalo me, proc dochazi k te chybe.

[Error] Project1.dpr(9): Incompatible types: 'Array' and 'Integer'

Typ Variant navic nelze inicializovat pomoci typove konstanty, pouze az v dobe
behu kodu.

> Pouzitim recordu ale dojde k tomu, ze se na hodnoty nedostanu pomoci indexu
> a to je skoda. Budu muset predelat system kodu.  

Co to napsat jako seznam objektu, pak lze udelat pristup dle libosti.

Petr Vones

Odpovedá: Petr Vones

27. 11. 2002 23:08

From: "Robert Vršecký" <robert.vrsecky@softok.cz>
> Proč padájí delphi je jasné.

Neni, prekladac musi ohlasit chybu a ne spadnout s AV, v Delphi 7 je to uz
opravene.

> Pokud se napíše array[1..2,1..5]of variant, tak pole může být pouze jednoho
> typu. (např integer). Není možné mít jednu hodnotu číselnou a druhou hodnotu
> textovou, protože tomu delphi nemůžou rozumět...

To je samozrejme nesmysl, od ceho je typ Variant:

program Project1;

{$APPTYPE CONSOLE}

uses
  Variants;

var
  AnArray: array [0..2] of Variant;
  I: Integer;

begin
  AnArray[0] := 42;
  AnArray[1] := 'Bla';
  AnArray[2] := 3.14;

  for I := Low(AnArray) to High(AnArray) do
    WriteLn(I, ': ', VarToStr(AnArray[I]));
  ReadLn;

end.

Petr Vones

Odpovedá: Bohuslav Švancara

29. 11. 2002 16:31

Tohle (skoro) funguje:

{$A+,B-,C+,D+,E-,F-,G+,H+,I+,J+,K-,L+,M-,N+,O-,P+,Q+,R+,S-,T-,U-,V+,W+,X+,Y+
,Z1}

type
  TPole = array[1..6] of TVarRec;

const
  AnsiAhoj: AnsiString = 'Ansi_Ahoj';
  ShortAhoj: ShortString = 'Short_Ahoj';
  Ext : Extended = 0.123456e3;

  Status: TPole = ((VInteger: 12345; VType: vtInteger),
                   (VBoolean: true; VType: vtBoolean),
                   (VAnsiString: @AnsiAhoj; VType: vtAnsiString),
                   (VString: @ShortAhoj; VType: vtString),
                   (VBoolean: false; VType: vtBoolean),
                   (VExtended: @Ext; VType: vtExtended));

function GetStatus(const Index: Integer): Variant;
begin
  with Status[Index] do begin
    case VType of
      vtInteger: Result := VInteger;
      vtBoolean: Result := VBoolean;
      vtChar: Result := VChar;
      vtExtended: Result := VExtended^;
      vtString: Result := VString^;
      vtPChar: Result := VPChar^;
      vtAnsiString: Result := AnsiString(VAnsiString^);
      vtVariant: Result := VVariant^;
    end;
  end;
end;


procedure P;
var
  S: string;
  i: Integer;
  e: Extended;
begin
  S := format('%d %s', [Status[1].VInteger, GetStatus(3)]);
  if Status[2].VBoolean
    then ShowMessage(S);

  S := format('%d %s %g', [Status[1].VInteger, GetStatus(4),
Status[6].VExtended^]);
  if not GetStatus(5)
    then ShowMessage(S);


  //Nasledujici prikazy ale nefunguji - nevim proc. Mozna "Format" nema rad
varianty...
  //Nastava vyjimka EConvertError: Format '%d' invalid or incompatiible with
argument

  // S := format('%d',[GetStatus(1)]);
  //Ale pritom tohle funguje:
  i := GetStatus(1);

  // S := format('%g',[GetStatus(6)]);
  //Ale pritom tohle funguje:
  e := GetStatus(6);
  // a toto taky funguje. Mozna to chce jeste nejak dopiplat funkci
GetStatus...
  S := format('%g', [Status[6].VExtended^]);
end;

S pozdravem

Bohuslav Švancara, prom. mat.
svancara@softprojekt.cz

> -----Original Message-----
> From: delphi-l-owner@clexpert.cz [mailto:delphi-l-owner@clexpert.cz]On
> Behalf Of Ing. Jiri SOKOL
> Sent: Wednesday, November 27, 2002 10:07 AM
> To: dotaz-delp
> Subject: Pad Delphi pri definici vicerozmeroveho konstantniho pole
>
>
> Ahoj,
>
> zkousel jsem toto:
>
> type
> pole=array[1..2,1..5]of variant;
> const
> status:pole=
> (1,true,'Ahoj','Uvitani',''),
> (2,false,'Hezky den','Rozlouceni','');
>
> Pak mi spadnou cely Delphi. Nevite nekdo, kde delam chybu?
> P.S.:Obsah konstatniho pole berte s rezervou ... hodnoty pouzivam
> jine, ale nejsou stejneho typu a
> proto bych potreboval udrzet typ variant
>
> Ing. Jiri Sokol, js-delphi@seznam.cz, +420251431187
> D6ProfSP2,WinNT
> amatersky programator
>
> ______________________________________________________________________
> Reklama:
> Mapy Prahy, Brna a Cech najdete na http://www.mapy.cz
>